// 大文件分片上传，断点续传，秒传
import { ElMessage } from 'element-plus';
import SparkMD5 from 'spark-md5';
import { fileHashIsExist, requestMultiUpload } from '@/api/test/index';

interface splitDataType {
  hash: string;
}
// 定义切片所需公共参数
let splitData: splitDataType = {
  hash: '',
};

const sliceFileUpload = async (fileInfo: any) => {
  let { size, type, name, lastModified } = fileInfo;
  console.log('1234', size, type, name, lastModified);
  let fileSize = size / 1024 / 1024;
  if (fileSize > 5) return ElMessage({ type: 'error', message: '上传文件大小不得超过5M' });
  isFileHash(fileInfo);
  let requestSliceList = sliceFile(fileInfo); // 分片请求的promise列表
  console.log('分片请求数组', requestSliceList);
  // 分片前准备接口
  requestUploadSplit(requestSliceList[0]);
  // 准备分片所需的参数
  let sliceFileUploadHttpList = requestSliceList.map((item) => {
    console.log('处理分片所需参数');
  });
  for (let i = 0; i < requestSliceList.length; i++) {
    let _data = {};
    let res = await requestMultiUpload(_data);
    console.log('res', res);
    if (i == requestSliceList.length) {
      // 合并分片
      let info = {};
      requestConble(info);
    }
  }
};

// 判断文件在服务器是否存在
const isFileHash = async (fileInfo: any) => {
  let hash = getHash(fileInfo);
  // 接口调用判断此hash值数据库是否存在
  let res = await fileHashIsExist({ hash });
  if (res.code === 200) {
    // 返回接口数据文件信息并处理
    return;
  } else {
  }
};

// 文件切片
const sliceFile = (file: any) => {
  let { size, type, name, lastModified } = file;
  const sliceSize = 1024 * 1024; // 1MB的分片大小
  const fileSize = size / 1024 / 1024; //文件大小
  const totalChunks = Math.ceil(fileSize / sliceSize); // 文件分片总数
  let tempFileList = []; // 分片请求的promise列表
  let identifier = lastModified.toString() + new Date().getTime();
  for (let i = 1; i <= totalChunks; i++) {
    const start = i * sliceSize; // 当前分片在文件中的起始位置
    const end = Math.min(start + sliceSize, fileSize); // 当前分片在文件中的终止位置
    const chunk = file.slice(start, end); // 获取当前分片
    let item = {
      hash: getHash(file), // hash值
      fileName: name, // 文件名
      totalChunks, // 总切片数
      file: chunk, // 当前切片
      identifier, // 切片时间
      chunkNumber: i, // 当前切片个数
    };
    tempFileList.push(item);
  }
  return tempFileList;
};

// 分片前准备请求
const requestUploadSplit = (info: any) => {
  console.log('分片前准备', info);
};

// 请求合并分片文件
const requestConble = (identifier: any) => {
  console.log('合并分片');
};

// 计算hash值
const getHash = (file: any) => {
  const fileReader = new FileReader(); // 文件读取器
  fileReader.onload = function () {
    const spark = new SparkMD5.ArrayBuffer(); // 构建hash值对象
    spark.append(fileReader.result); // 添加文件二进制内容
    const hash = spark.end(); // 计算hash值
    console.log(hash);
  };
  return fileReader.readAsArrayBuffer(file);
};

export default sliceFileUpload;
